// 导航守卫
import router from '@/router'
import store from '@/store' // store===this.$store
// 前置守卫
const whitePage = ['/404', '/login']
router.beforeEach(async(to, from, next) => {
  // console.log('beforeEach')
  //    to:要去的路由信息
  //    from:从哪来的路由信息
  //    next:是否允许通过  next()正常通过  next('/path地址')重新再走一次导航守卫
  //   目标：首页要登录才可进入，登录页登陆状态下不可进入，404任何状态都可进入
  /*
    是否有token
        有token
           判断要去的页面是否是登录页
               是：去首页
               不是：正常进入
        没有token
           白名单页面正常进入
           非白名单页面：
                去登录页
*/
  //   console.log(to)
  if (store.state.user.token) {
    if (to.path.toLowerCase() === '/login') {
      next('/')
    } else {
      // 没有用户信息才调用接口获取用户信息
      if (!store.state.user.userInfo.userId) {
        await store.dispatch('user/getUserInfo')
        // 判断要去的路由是否有权限，有next(to.fullPath)  没有：next('/')
        next(to.fullPath)
      } else {
        next()
      }
    }
  } else {
    if (whitePage.includes(to.path.toLowerCase())) {
      next()
    } else {
      // 它想去的页面
      // console.log('to', to)
      // fullPath:带参数的path地址
      // path:不带传参
      next('/login?back=' + to.fullPath)
    }
  }
})
router.beforeResolve((to, from, next) => {
  // console.log('beforeResolve')
  next()
})
// 后置守卫：已在相应路由（to）
//
/*
通过vuex存储to的值并保证不重复
1：在vuex中定义一个模块用于存储to的值
2：在后置守卫中调用mutations方法用于存储
*/
router.afterEach((to, from) => {
  // console.log('afterEach')
  // to的path在store.state.histroyList.routesList是否存在
  // every:每一项都满足条件返回值就是true,
  // some:只要有一项满足条件返回值就是true
  const bol = store.state.histroyList.routesList.some((item) => {
    return item.path === to.path.toLowerCase()
  })
  if (!bol) {
    store.commit('histroyList/setRoutesList', [
      ...store.state.histroyList.routesList,
      to
    ])
  }
})
